package lajp;

/**
 * 队列回收
 * @author diaoyf
 *
 */
public class QueueGC extends Thread 
{
	/** 超时时间(5分钟) */
	static final long TIMEOUT_SECOND = 5 * 60 * 1000;
	
	/** 回收池上限 10000 */
	static final int MAX_THREAD = 10000;
	/** 回收池 */
	static GCPoolItem[] queuePool = new GCPoolItem[MAX_THREAD];
	
	/**
	 * 线程加入回收池
	 * @return 如果无空闲位置，返回null
	 */
	public static synchronized GCPoolItem put(int msgType)
	{
		//创建一个池对象
		GCPoolItem item = new GCPoolItem();
		item.msgType = msgType;							//request消息类型
		item.creatTime = System.currentTimeMillis();	//创建时间
		item.state = 0; 								//创建状态
		
		//池内是否有闲置的位置
		boolean hasUnused = false; 
		
		//遍历线程池,找一个空闲的
		for (GCPoolItem itemInPool : queuePool)
		{
			if (itemInPool == null)
			{
				itemInPool = item;
				hasUnused = true;
				break;
			}
		}
		
		if (hasUnused)
		{
			return item;
		}
		else
		{
			return null;
		}
	}
	
	@Override
	public void run()
	{
		while (true)
		{
			try //保障持续运行
			{
				//遍历线程池
				for (GCPoolItem itemInPool : queuePool)
				{
					//空位
					if (itemInPool == null)
					{
						continue;
					}
					
					//线程已结束
					if (itemInPool.state == 5)
					{
						//清位置
						itemInPool = null;
						continue;
					}
					
					//未超时
					if (itemInPool.creatTime + TIMEOUT_SECOND > System.currentTimeMillis())
					{
						continue;
					}
					else //已超时
					{
						//收尾，清空消息队列
						for (int i = 0; i < itemInPool.reqCount; i++)
						{
							switch (itemInPool.state)
							{
								case 0: //握手回应没发出去，很可能队列已满(已无法回收处理)
									//不处理，发出告警
									break;
								case 1: //还在等第一条request(很可能客户端已消亡)
									//发送一条“占位”request，让线程不再等待
									//TODO
									break;
								case 2: //已接收第一条request,等待其余的(很可能客户端已消亡)
									//发送一条“占位”request，让线程不再等待
									//TODO
									break;
								case 3: //已接收所有消息(可能阻塞到业务方法的执行)
									//不处理(业务实现问题)
									break;
								case 4: //等待response回应(很可能客户端已不在)
									//发送一条“假的”response回应，让线程不再等待
									//TODO
									//模拟客户端接收response
									//TODO
									break;								
							}
						}
						
						//清位置
						itemInPool = null;
					}
					
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			
			//稍息片刻
			try
			{
				sleep(10);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
}

class GCPoolItem
{
	/** 消息类型(request) */
	int msgType;
	
	/** 创建时间 */
	long creatTime;
	/**
	 * 状态
	 * <li>0:创建</li>
	 * <li>1:已发送握手回应</li>
	 * <li>2:已接收第一条消息(消息数量记录在reqCount)</li>
	 * <li>3:已接收所有消息</li>
	 * <li>4:已发送所有消息(消息数量记录在rspCount), 等待response回应</li>
	 * <li>5:线程关闭</li>
	 */
	int state;
	/** request清理次数 */
	int reqCount = -1;
	/** response清理次数 */
	int rspCount = -1;
}
 